/**
 * 将数字金额转换为中文大写金额
 * @param {Number} num - 数字金额
 * @returns {String} 中文大写金额
 */
function numberToChinese(num) {
  const CN_NUM = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
  const CN_UNIT = ['', '拾', '佰', '仟'];
  const CN_RADICE = ['', '万', '亿', '兆'];
  const CN_DOLLAR = '元';
  const CN_TEN_CENT = '角';
  const CN_CENT = '分';
  const CN_INTEGER = '整';

  if (num === 0) return CN_NUM[0] + CN_DOLLAR + CN_INTEGER;
  if (num < 0 || num >= 1000000000000) return '数据非法';

  // 四舍五入保留两位小数
  num = Math.round(num * 100) / 100;
  let parts = num.toString().split('.');
  let integerPart = parts[0];
  let decimalPart = parts.length > 1 ? parts[1].padEnd(2, '0').slice(0, 2) : '00';

  let result = '';
  let zeroCount = 0;

  // 处理整数部分
  for (let i = 0; i < integerPart.length; i++) {
    let p = integerPart.length - i - 1;
    let n = parseInt(integerPart[i]);

    if (n === 0) {
      zeroCount++;
    } else {
      if (zeroCount > 0) {
        result += CN_NUM[0];
      }
      zeroCount = 0;
      result += CN_NUM[n] + CN_UNIT[p % 4];
    }

    if (p % 4 === 0 && ((p / 4) % CN_RADICE.length !== 0 || p === 0)) {
      result += CN_RADICE[p / 4];
    }
  }

  // 去掉多余的零和单位
  result = result.replace(/(零+)[拾佰仟]/g, '$2');
  result = result.replace(/(零+万|零+亿)/g, '零');
  result = result.replace(/(零+角零+分)$/, '零分');
  result = result.replace(/(零+角)$/, '零角');
  result = result.replace(/零+$/, '');
  result = result.replace(/^元/, '');

  // 添加“元”
  result = result ? result + CN_DOLLAR : CN_NUM[0] + CN_DOLLAR;

  // 处理小数部分
  if (decimalPart !== '00') {
    if (parseInt(decimalPart[0]) !== 0) {
      result += CN_NUM[parseInt(decimalPart[0])] + CN_TEN_CENT;
    }
    if (parseInt(decimalPart[1]) !== 0) {
      result += CN_NUM[parseInt(decimalPart[1])] + CN_CENT;
    }
  } else {
    result += CN_INTEGER;
  }

  return result;
}


console.log('将数字金额转换为中文大写金额 :>>', numberToChinese(1234567890.12));